﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using SIAKADCORE.Helpers;
using SIAKADCORE.Models;
using System.Data;

namespace SIAKADCORE.Controllers
{
    /// <summary>
    /// Kelas DosenController
    /// </summary>
    public static class DosenController
    {
        /// <summary>
        /// Method untuk menambahkan entri dosen.
        /// </summary>
        /// <param name="dosen">Kelas Dosen.</param>
        /// <returns>True ketika sukses menambahkan entri dan sebaliknya.</returns>
        public static bool Tambah(Dosen dosen)
        {
            string queryString = string.Format("INSERT INTO {0} ({1} ,{2} ,{3}) VALUES ('{4}' ,'{5}' ,'{6}')",
                Dosen.TableName, Dosen.ColumnNameIdDosen,
                Dosen.ColumnNameNamaDosen, Dosen.ColumnNameNip,
                dosen.IdDosen, dosen.NamaDosen, dosen.Nip);
            bool isSuccess = SQLHelper.Instance.ExecuteNonQuery(queryString);
            var log = new Log
            {
                IdLog = "LogController.GetID()",
                IsiLog = DosenController.TambahLogMessage(dosen)
            };
            bool logSuccess = LogController.Tambah(log);
            return (isSuccess && logSuccess);
        }
        public static string TambahLogMessage(Dosen dosen)
        {
            return string.Format("{0}: Ditambahkan dosen baru dengan rincian: [{1}].", DateTime.Now, dosen.ToString());
        }

        /// <summary>
        /// Method untuk mengubah entri dosen.
        /// </summary>
        /// <param name="idDosen">Id dosen yang akan diubah.</param>
        /// <param name="dosen">Kelas Dosen.</param>
        /// <returns>True ketika sukses mengubah entri dan sebaliknya.</returns>
        public static bool Ubah(string idDosen, Dosen dosen)
        {
            string queryString = string.Format("UPDATE {0} SET {1} = '{2}' ,{3} = '{4}' ,{5} = '{6}' WHERE {1} = '{7}",
                Dosen.TableName, Dosen.ColumnNameIdDosen, dosen.IdDosen,
                Dosen.ColumnNameNamaDosen, dosen.NamaDosen,
                Dosen.ColumnNameNip, dosen.Nip, idDosen);
            bool isSuccess =  SQLHelper.Instance.ExecuteNonQuery(queryString);
            var log = new Log
            {
                IdLog = "LogController.GetID()",
                IsiLog = DosenController.UbahLogMessage(idDosen, dosen)
            };

            bool logSuccess = LogController.Tambah(log);
            return (isSuccess && logSuccess);
        }

        public static string UbahLogMessage(string idDosen, Dosen dosen)
        {
            return string.Format("{0}: Dosen ber-id [{1}] telah diubah dengan rincian: [{2}].", DateTime.Now, idDosen, dosen.ToString());
    }

        /// <summary>
        /// Method untuk menghapus entri dosen.
        /// </summary>
        /// <param name="idDosen">Id dosen yang akan dihapus.</param>
        /// <returns>True ketika sukses menghapus entri dan sebaliknya.</returns>
        public static bool Hapus(string idDosen)
        {
            string queryString = string.Format("DELETE FROM {0} WHERE {1} = '{2}'",
                Dosen.TableName, Dosen.ColumnNameIdDosen, idDosen);
            bool isSuccess = SQLHelper.Instance.ExecuteNonQuery(queryString);
            var log = new Log
            {
                IdLog = "LogController.GetID()",
                IsiLog = DosenController.HapusLogMessage(idDosen)
            };
            bool logSuccess = LogController.Tambah(log);
            return (isSuccess && logSuccess);
        }

        public static string HapusLogMessage(string idDosen)
        {
            return string.Format("{0}: Dosen ber-id [{1}] telah dihapus.", DateTime.Now, idDosen);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel dosen.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabel(out DataSet dataset)
        {
            string queryString = string.Format("SELECT {0} ,{1} ,{2} FROM {3}",
                Dosen.ColumnNameIdDosen, Dosen.ColumnNameNamaDosen,
                Dosen.ColumnNameNip, Dosen.TableName);
            return SQLHelper.Instance.ExecuteReader(queryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel dosen.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <param name="customQueryString">Kustomisasi query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabel(out DataSet dataset, string customQueryString)
        {
            return SQLHelper.Instance.ExecuteReader(customQueryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan id dosen. Digunakan pada saat memasukkan entri baru.
        /// </summary>
        /// <returns>string kosong ketika terjadi error atau id dosen baru.</returns>
        public static string GetID()
        {
            var dataset = new DataSet();
            bool isQueryAccomplished = GetTabel(out dataset);
            if (!isQueryAccomplished) return string.Empty;

            return SQLHelper.Instance.GetID(Dosen.IdPrefix, Dosen.IdLength, ref dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan nama dosen.
        /// </summary>
        /// <param name="idDosen">idDosen</param>
        /// <returns>String kosong jika tidak ditemukan atau nama dosen.</returns>
        public static string GetName(string idDosen)
        {
            var dataset = new DataSet();
            string queryString = string.Format("SELECT {0} FROM {1} WHERE {2} = '{3}'",
                Dosen.ColumnNameNamaDosen, Dosen.TableName,
                Dosen.ColumnNameIdDosen, idDosen);
            bool isSuccess = GetTabel(out dataset, queryString);

            if (!isSuccess)
            {
                return string.Empty;
            }
            else
            {
                return dataset.Tables[0].Rows[0][0].ToString();
            }
        }

        /// <summary>
        /// Method untuk mengecek ada tidaknya idDosen dalam tabel.
        /// </summary>
        /// <param name="idDosen">idDosen yang akan dicek.</param>
        /// <returns>True ketika idDosen telah terdapat dalam tabel.</returns>
        public static bool IsExist(string idDosen)
        {
            var dataset = new DataSet();
            string queryString = string.Format("SELECT {0} ,{1} , {2} FROM {3} WHERE {0} = '{4}'",
                Dosen.ColumnNameIdDosen, Dosen.ColumnNameNamaDosen, Dosen.ColumnNameNip,
                Dosen.TableName, idDosen);
            bool isSuccess = GetTabel(out dataset, queryString);

            if (!isSuccess)
            {
                return false;
            }
            else
            {
                return dataset.Tables[0].Rows.Count == 1;
            }
        }
    }
}
